/**
 * 项目名：	Rumba Plan
 * 
 * 版权所有(C)，上海海鼎信息工程股份有限公司，2006，所有权利保留。
 * 
 * 文件名：	LabelHField.java
 * 模块说明：	带有Label显示的字段 | 服务端界面控件
 * 修改历史：
 * 2006-5-26 - lxm - 创建。
 */
package com.hd123.rumba.jsp;

import java.util.ArrayList;
import java.util.List;

import org.apache.ecs.html.Input;
import org.apache.ecs.html.Label;
import org.apache.ecs.html.TD;

import com.hd123.rumba.request.Dictionary;
import com.hd123.rumba.util.AccessMode;

/**
 * 带有Label显示的字段 | 服务端界面控件
 * <p>
 * 
 * 页面模型：<br>
 * <table border=0 cellspacing=3 cellpadding=0>
 * <tr bgcolor=skyblue>
 * <td>界面元素</td>
 * <td>对象属性</td>
 * <td>说明</td>
 * </tr>
 * <tr>
 * <td><code>&lt;td&gt;</code></td>
 * <td>tdLabel</td>
 * <td></td>
 * </tr>
 * <tr bgcolor=aliceblue>
 * <td><code>&nbsp;&nbsp;&lt;label&gt;</code></td>
 * <td>label</td>
 * <td></td>
 * </tr>
 * <tr>
 * <td><code>&nbsp;&nbsp;&lt;input type=hidden&gt;</code></td>
 * <td>inputReadWrite</td>
 * <td>只有当当前用户对字段不可见或只读的时候出现。</td>
 * </tr>
 * <tr bgcolor=aliceblue>
 * <td><code>&lt;td&gt;</code></td>
 * <td>tdContent</td>
 * <td></td>
 * </tr>
 * </table>
 * 
 * @author lxm
 * 
 */
public abstract class LabelHField extends BaseHField {

  public LabelHField(Dictionary dd, String name, String caption, Object value, Object[] params) {
    super(dd, name, caption, value, params);
  }

  public LabelHField(Dictionary dd, String name, String caption, Object value) {
    super(dd, name, caption, value);
  }

  private TD tdLabel;
  private TD tdContent;
  private Label label;
  private Input inputReadWrite;
  private String hotKey;
  protected List<IHFieldButton> buttons = new ArrayList();

  public void build() {
    super.build();
    // 将buttons加入tdContent中。
    for (int i = 0; i < buttons.size(); i++)
      tdContent.addElement("&nbsp;" + buttons.get(i).toHTML(accessMode, promptMode));
  }

  public String toHTML() {
    super.toHTML();
    return tdLabel.toString() + tdContent.toString();
  }

  /**
   * 只读属性：存放标签部分的界面元素&lt;label&gt;<br>
   * 对应的参数名"label"
   */
  public Label getLabel() {
    if (label == null) {
      label = new Label();
      label.setID("label_" + this.getName());
    }
    return label;
  }

  /**
   * 只读属性：标记当前字段是否可读写&lt;input type=hidden&gt;<br>
   * 对应参数名"inputReadWrite"
   */
  public Input getInputReadWrite() {
    if (inputReadWrite == null) {
      inputReadWrite = new Input();
      inputReadWrite.setType("hidden");
      inputReadWrite.setName(this.getName() + "_readWrite");
      inputReadWrite.setID(this.getName() + "_readWrite");
    }
    return inputReadWrite;
  }

  /**
   * 只读属性：存放标签部分的界面元素&lt;TD&gt;<br>
   * 对应的参数名"tdContent"。
   */
  public TD getTdContent() {
    if (tdContent == null)
      tdContent = new TD();
    return tdContent;
  }

  /**
   * 只读属性：存放标签部分的界面元素&lt;TD&gt;<br>
   * 对应的参数名"tdLabel"。
   */
  public TD getTdLabel() {
    if (tdLabel == null)
      tdLabel = new TD();
    return tdLabel;
  }

  /**
   * 属性：热键。<br>
   * 将自动添加到显示的标题中。<br>
   * 对应的参数名"hotKey"，下一参数类型为String。
   */
  public String getHotKey() {
    return hotKey;
  }

  public void setHotKey(String hotKey) {
    this.hotKey = hotKey;
  }

  /**
   * 添加一个按钮。
   * 
   * @param button
   *          被添加的按钮。
   * @return 返回当前对象(this)。
   */
  public LabelHField addButton(IHFieldButton button) {
    this.buttons.add(button);
    button.setField(this);
    return this;
  }

  protected boolean readParam(String paramName, Object paramValue) {
    if ("hotKey".equals(paramName)) {
      this.hotKey = (String) paramValue;
      return true;
    }
    return false;
  }

  protected void buildHTML(int accessMode, int promptMode) {
    TD tdLabel = this.getTdLabel();
    if (promptMode == VALUE_PROMPTMODE_NORMAL)
      tdLabel.setClass("field_label");
    else
      tdLabel.setClass("field_label_error");
    tdLabel.setNoWrap(true);
    assignElementAttrs(tdLabel, "tdLabel");
    Label label = this.getLabel();
    label.setFor(this.getName());
    assignElementAttrs(label, "label");
    label.addElement(this.getCaption());
    if (this.hotKey != null) {
      label.setAccessKey(this.hotKey);
      label.addElement("(<u>" + this.hotKey + "</u>)");
    }
    if (this.getIsRequired().booleanValue())
      label.addElement("&nbsp;<font color=red>*</font>");
    tdLabel.addElement(label);

    if (accessMode != AccessMode.READWRITE) {
      Input inputReadWrite = this.getInputReadWrite();
      inputReadWrite.setValue("false");
      tdLabel.addElement(inputReadWrite);
    }

    TD tdContent = this.getTdContent();
    tdContent.setClass("field_input");
    assignElementAttrs(tdContent, "tdContent");
  }

}
